/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: Lenovo
 * Date: 2025-04-08
 * Time: 8:16
 */
public class Main {
    public static void main(String[] args) {
        System.out.println("/*-------------- 字符访问方法 ---------------*/");
        // 方法一：char charAt(int index)
        // 功能：返回字符串中指定索引位置的字符。
        String greeting = "Hello";
        char secondChar = greeting.charAt(1);// 返回'e'（索引从0开始）
        char lastChar = greeting.charAt(4);// 返回'o'
        //char errorChar = str1.charAt(5); // 抛出异常StringIndexOutOfBoundsException：索引越界
        System.out.println("第二个字符: " + secondChar);//e
        System.out.println("最后一个字符: " + lastChar);//o

        System.out.println(" /*-------------- 正向查找方法 --------------*/");
        // 方法二：int indexOf(int ch)
        // 功能：返回字符 ch 第一次出现的索引，未找到返回 -1。
        String fruit = "apple";
        int firstPIndex = fruit.indexOf('p');// 返回 1（第一个'p'的索引）
        int notFoundIndex = fruit.indexOf('z');// 返回-1（未找到）
        System.out.println("第一个'p'位置: " + firstPIndex);//1
        System.out.println("查找不存在的字符: " + notFoundIndex);//-1

        // 方法三：int indexOf(int ch, int fromIndex)
        // 功能：从 fromIndex 开始向后搜索，返回 ch 第一次出现的索引。
        String banana = "banana";
        int aAfterIndex2 = banana.indexOf('a', 2);
        int nAfterIndex4 = banana.indexOf('n', 4);
        System.out.println("从索引2找'a': " + aAfterIndex2);//3
        System.out.println("从索引4找'n': " + nAfterIndex4);//4

        // 方法四：int indexOf(String str)
        // 功能：返回子字符串 str 第一次出现的索引，未找到返回 -1。
        String sentence = "Hello world";
        int worldStart = sentence.indexOf("world");// 返回6（"world"从索引6开始）
        int doubleLStart = sentence.indexOf("ll");// 返回2
        int javaNotFound = sentence.indexOf("Java"); // 返回-1（未找到）
        System.out.println("\"world\"起始位置: " + worldStart);//6
        System.out.println("\"ll\"起始位置: " + doubleLStart);//2
        System.out.println("查找不存在的子串: " + javaNotFound);//-1

        /*方法五：int indexOf(String str, int fromIndex)
        功能：该方法用于在字符串中从指定的起始索引fromIndex（包含该索引）开始，查找子字符串str第一次出现的位置。
        参数：
            str：目标子字符串
            fromIndex：起始搜索位置（包含该位置）
        返回值：
            找到时返回子串首字符索引
            未找到返回-1
        特殊说明：
            fromIndex < 0 时视为0
            fromIndex >= 长度时直接返回-1*/
        String text = "Hello, Java! Java is cool.";
        int firstJavaIndex = text.indexOf("Java", 0); // 从索引0开始查找"Java"
        int secondJavaIndex = text.indexOf("Java", 9);// 从索引9开始查找"Java"
        System.out.println("第一个Java位置: " + firstJavaIndex);//7
        System.out.println("后续Java位置: " + secondJavaIndex);//13

        String repeatingStr = "abcabcabc";
        int secondAbcIndex = repeatingStr.indexOf("abc", 3); //从索引3开始查找"abc"
        int emptyStrIndex = repeatingStr.indexOf("", 3);// 查找空字符串
        System.out.println("第二个abc起始位置: " + secondAbcIndex);//3
        System.out.println("空字符串特殊处理: " + emptyStrIndex);// 输出3（空字符串在任意位置存在）


        System.out.println("\n/*-------------- 逆向查找方法 ---------------*/");
        /*方法六：int lastIndexOf(int ch)
        功能：从后往前找，返回ch第一次出现的位置，没有返回-1*/
        String colors = "red, green, blue";
        int lastEIndex = colors.lastIndexOf('e');  // 从后往前找，返回'e'第一次出现的位置
        System.out.println("最后一个'e'的位置: " + lastEIndex); // 15

        /*方法七：int lastIndexOf(int ch, int fromIndex)
        功能：从fromIndex位置开始找，从后往前找ch第一次出现的位置，没有返回-1
        搜索范围: [0, fromIndex]*/
        String letterSequence = "ABCDEABCDE";
        int lastDBefore5 = letterSequence.lastIndexOf('D', 5);// 从索引5向左找，返回3（找到索引3的 'D'）
        System.out.println("索引5前最后的'D': " + lastDBefore5);//3

        /*方法八：int lastIndexOf(String str)
        功能：从后往前找，返回str第一次出现的位置，没有返回-1*/
        String patternStr = "ababaab";
        int lastAbIndex = patternStr.lastIndexOf("ab");   // 返回5（最后一次出现的 "ab" 在索引5）
        int notFoundStr = patternStr.lastIndexOf("xy"); // 返回-1（未找到）
        System.out.println("最后出现的'ab': " + lastAbIndex);//5
        System.out.println("查找不存在的'xy': " + notFoundStr);//-1


        /*方法九：int lastIndexOf(String str, int fromIndex)
        功能：从fromIndex位置开始找，从后往前找str第一次出现的位置，没有返 回-1*/
        String sampleStr = "ababaaba";
        int abBefore4 = sampleStr.lastIndexOf("ab", 4);  // 从索引4向左找，返回2（"ab"在索引2-3）
        System.out.println("索引4前最后的'ab': " + abBefore4);//2

        System.out.println("\n/*-------------- 存在性判断方法 ---------------*/");
        // 方法十：boolean contains(CharSequence s)
        String email = "john.doe@example.com";
        boolean hasDomain = email.contains("@example");
        boolean hasSpace = email.contains(" ");
        System.out.println(hasDomain);// true
        System.out.println(hasSpace); // false

        System.out.println("\n/*-------------- 前缀检查方法 ---------------*/");
        // 方法十一：boolean startsWith(String prefix)
        String filePath = "https://www.example.com/files/doc.pdf";
        boolean isHttps = filePath.startsWith("https://");
        boolean isFtp = filePath.startsWith("ftp://");
        System.out.println(isHttps); // true
        System.out.println(isFtp); // false

        // 带偏移量的检查
        String code = "ABCD1234XYZ567";
        boolean has1234 = code.startsWith("1234", 4);  // 从索引4开始检查
        System.out.println(has1234);// true

        System.out.println("\n/*-------------- 后缀检查方法 ---------------*/");
        // 方法十二：boolean endsWith(String suffix)
        String fileName = "MainApplication.java";
        boolean isJavaFile = fileName.endsWith(".java");
        boolean isClassFile = fileName.endsWith(".class");
        System.out.println(isJavaFile);// true
        System.out.println(isClassFile);// false

        // 长后缀测试
        String uuid = "6ba7b814-9dad-11d1-80b4-04fd430c8";
        boolean validUUIDFormat = uuid.endsWith("-04fd430c8");
        System.out.println(validUUIDFormat);// true
    }
}
